package cn.aiweiyi.qingjing.coupon.distribution.vo;

import cn.aiweiyi.qingjing.coupon.comm.constant.CouponStatus;
import cn.aiweiyi.qingjing.coupon.comm.constant.PeriodType;
import cn.aiweiyi.qingjing.coupon.distribution.entity.Coupon;
import com.sun.org.apache.bcel.internal.generic.NEW;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.time.DateUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author 青衿
 * @Date 2020/11/21 19:17
 * 用户优惠券的分类,根据优惠券状态
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CouponClassify {
    /**
     * 可以使用的
     */
    private List<Coupon> usable;

    /**
     * 已使用的
     */
    private List<Coupon> used;

    /**
     * 已过期的
     */
    private List<Coupon> expired;

    /**
     * 对一批优惠券进行分类,分类时顺便每个校验优惠券是否过期
     *
     * @param coupons
     * @return
     */
    public static CouponClassify classify(List<Coupon> coupons) {
        List<Coupon> usable = new ArrayList<>(coupons.size());
        List<Coupon> used = new ArrayList<>(coupons.size());
        List<Coupon> expired = new ArrayList<>(coupons.size());

        coupons.forEach(c -> {
            //判断优惠券是否过期
            boolean isTimeExpire;
            long curTime = new Date().getTime();

            //如果过期类型是固定日期,name把过期时间和当前日期比较
            if (c.getTemplateSDK().getRule().getExpiration().getPeriod()
                    .equals(PeriodType.REGULAR.getCode())) {
                isTimeExpire = c.getTemplateSDK().getRule().getExpiration()
                        .getDeadline() <= curTime;
            } else {
                //如果过期类型是SHIFT,就在领取时间上加x天再和当前日期比较
                isTimeExpire = DateUtils.addDays(
                        c.getAssignTime(),
                        c.getTemplateSDK().getRule().getExpiration().getGap()
                ).getTime() <= curTime;
            }

            if (c.getStatus() == CouponStatus.USED) {
                used.add(c);
            } else if (c.getStatus() == CouponStatus.EXPIRED || isTimeExpire) {
                expired.add(c);
            } else {
                usable.add(c);
            }
        });

        return new CouponClassify(usable,used,expired);
    }
}
